package dibujo;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Polygon;

public class NodoDibujo {

	private Graphics _grafico;
	private int _posicionX;
	private int _posicionY;
	private int _anchoNodo;
	private int _altoNodo;
	private NodoDibujo _anterior;
	private NodoDibujo _siguiente;
	private String _dato;
	private int _posicion;
	
	public NodoDibujo(Graphics grafico,String dato){
		_grafico=grafico;
		_anchoNodo=70;
		_altoNodo=100;
		_anterior=null;
		_siguiente=null;
		_dato=dato;

	}
	public void crearNodo()
	{
		crearAnterior();
		crearDato();
		crearSiguiente();
		crearApuntamientoAnterior();
		crearApuntamientoSiguiente();
		dibujarPosicion();
	}
	private void dibujarPosicion() {
		_grafico.setColor(new Color (53,107,110));
		_grafico.drawString("[ "+_posicion+" ]", _posicionX, _posicionY-5);	
	}
	private void crearApuntamientoSiguiente() {
		_grafico.setColor(new Color (142,45,67));
		if(_siguiente==null)
		{
			
			_grafico.drawLine(_posicionX+_anchoNodo,_posicionY+(_altoNodo*7/8),_posicionX+_anchoNodo+15,_posicionY+(_altoNodo*7/8));
			_grafico.drawLine(_posicionX+_anchoNodo+15,_posicionY+(_altoNodo*7/8),_posicionX+_anchoNodo+15,_posicionY+(_altoNodo*7/8)+30);
			_grafico.fillPolygon(RellenarFlechaAbajo(new Point(_posicionX+_anchoNodo+15,_posicionY+(_altoNodo*7/8)+35)));
			_grafico.drawString("NULL", _posicionX+_anchoNodo, _posicionY+(_altoNodo*7/8)+55);
		}
		else if (_siguiente.getPosicionY()!=_posicionY)
		{
			_grafico.drawLine(_posicionX+_anchoNodo,_posicionY+(_altoNodo*7/8),_posicionX+_anchoNodo+50,_posicionY+(_altoNodo*7/8));
			_grafico.fillPolygon(RellenarFlechaDerecha(new Point(_posicionX+_anchoNodo+55,_posicionY+(_altoNodo*7/8))));
			_grafico.setColor(new Color (62,66,102));
			_grafico.drawLine(_posicionX+_anchoNodo+60,_posicionY+(_altoNodo/2),_posicionX+_anchoNodo+15,_posicionY+(_altoNodo/2));
			_grafico.fillPolygon(RellenarFlechaIzquierda(new Point(_posicionX+_anchoNodo+10,_posicionY+(_altoNodo/2))));
			_grafico.setColor(new Color (142,45,67));
		}
		else
		{
			_grafico.drawLine(_posicionX+_anchoNodo,_posicionY+(_altoNodo*7/8),_siguiente.getPosicionX()-20,_siguiente.getPosicionY()+(_siguiente.getAltoNodo()/2));
			_grafico.drawLine(_siguiente.getPosicionX()-20,_siguiente.getPosicionY()+(_siguiente.getAltoNodo()/2),_siguiente.getPosicionX()-5,_siguiente.getPosicionY()+(_siguiente.getAltoNodo()/2));
			_grafico.fillPolygon(RellenarFlechaDerecha(new Point(_siguiente.getPosicionX()-10,_siguiente.getPosicionY()+(_siguiente.getAltoNodo()/2))));
		}
		
	}
	private void crearApuntamientoAnterior() {
		_grafico.setColor(new Color (62,66,102));
		if (_anterior==null)
		{
			_grafico.drawLine(_posicionX,_posicionY+(_altoNodo/8),_posicionX-25,_posicionY+(_altoNodo/8));
			_grafico.drawLine(_posicionX-25,_posicionY+(_altoNodo/8),_posicionX-25,_posicionY+(_altoNodo/8)+30);
			_grafico.fillPolygon(RellenarFlechaAbajo(new Point(_posicionX-25,_posicionY+(_altoNodo/8)+35)));
			_grafico.drawString("NULL", _posicionX-40, _posicionY+(_altoNodo/8)+55);
		}
		else if (_anterior.getPosicionY()!=_posicionY)
		{	
			_grafico.setColor(new Color (142,45,67));
			_grafico.drawLine(0,_posicionY+(_altoNodo/2),_posicionX-15,_posicionY+(_altoNodo/2));
			_grafico.fillPolygon(RellenarFlechaDerecha(new Point(_posicionX-10,_posicionY+(_altoNodo/2))));
			_grafico.setColor(new Color (62,66,102));
			_grafico.drawLine(_posicionX,_posicionY+(_altoNodo/8),15,_posicionY+(_altoNodo/8));
			_grafico.fillPolygon(RellenarFlechaIzquierda(new Point(10,_posicionY+(_altoNodo/8))));
			
		}
		else
		{
			_grafico.drawLine(_posicionX,_posicionY+(_altoNodo/8),_anterior.getPosicionX()+_anterior.getAnchoNodo()+20,_anterior.getPosicionY()+(_anterior.getAltoNodo()/2));
			_grafico.drawLine(_anterior.getPosicionX()+_anterior.getAnchoNodo()+20,_anterior.getPosicionY()+(_anterior.getAltoNodo()/2),_anterior.getPosicionX()+_anterior.getAnchoNodo()+15,_anterior.getPosicionY()+(_anterior.getAltoNodo()/2));
			_grafico.fillPolygon(RellenarFlechaIzquierda(new Point(_anterior.getPosicionX()+_anterior.getAnchoNodo()+10,_anterior.getPosicionY()+(_anterior.getAltoNodo()/2))));
		}
		
	}
	
	private void crearSiguiente() {
		_grafico.setColor(Color.BLACK);
		_grafico.drawRect(_posicionX,getPosicionY1LineaInf(),_anchoNodo,_altoNodo/4);
		_grafico.setColor(new Color (101,163,38));
		_grafico.fillRect(_posicionX+1,getPosicionY1LineaInf()+1,_anchoNodo-1,(_altoNodo/4)-1);
		_grafico.setColor(Color.BLACK);
		_grafico.drawString("Siguiente",getXTextoSiguiente (), getYTextoSiguiente());
		
	}
	private void crearDato() {
		
		_grafico.setColor(Color.BLACK);
		_grafico.drawRect(_posicionX,getPosicionYDato(),_anchoNodo,_altoNodo/2);
		_grafico.setColor(new Color (140,155,184));
		_grafico.fillRect(_posicionX+1,getPosicionYDato()+1,_anchoNodo-1,(_altoNodo/2)-1);
		_grafico.setColor(Color.BLACK);
		_grafico.drawString(_dato,getXTextoDato(), getYTextoDato());
	}
	private void crearAnterior() {
		_grafico.setColor(Color.BLACK);
		_grafico.drawRect(_posicionX,_posicionY,_anchoNodo,_altoNodo/4);
		_grafico.setColor(new Color (101,163,38));
		_grafico.fillRect(_posicionX+1,_posicionY+1,_anchoNodo-1,(_altoNodo/4)-1);
		_grafico.setColor(Color.BLACK);
		_grafico.drawString("Anterior",getXTextoAnterior (), getYTextoAnterior());
		
	}
	public int getPosicionX() {
		return _posicionX;
	}
	public void setPosicionX(int posicionX) {
		_posicionX = posicionX;
	}
	public int getPosicionY() {
		return _posicionY;
	}
	public void setPosicionY(int posicionY) {
		_posicionY = posicionY;
	}
	public int getAnchoNodo() {
		return _anchoNodo;
	}
	public int getAltoNodo() {
		return _altoNodo;
	}

	private int getPosicionYDato()
	{
		return (_altoNodo/4)+_posicionY;
	}
	private int getPosicionY1LineaInf()
	{
		return ((_altoNodo*3)/4)+_posicionY;
	}
	private int getXTextoDato()
	{
		return (_anchoNodo/2)+_posicionX-3;
	}
	private int getYTextoDato()
	{
		return (_altoNodo/2)+_posicionY+5;
	}
	private int getXTextoAnterior()
	{
		return (_anchoNodo/4)+_posicionX-5;
	}
	private int getYTextoAnterior()
	{
		return (_altoNodo/7)+_posicionY+3;
	}
	private int getXTextoSiguiente()
	{
		return (_anchoNodo/4)+_posicionX-9;
	}
	private int getYTextoSiguiente()
	{
		return _altoNodo+_posicionY-6;
	}
	public void setAnterior(NodoDibujo anterior) {
		_anterior=anterior;
	}
	public void setSiguiente(NodoDibujo siguiente) {
		_siguiente=siguiente;
	}
	public void setPosicion(int posicion) {
		_posicion=posicion;
	}
	private Polygon RellenarFlechaAbajo(Point centro) {
		Polygon flecha= new Polygon();
		int lados=3;
		double alfa= ((2*Math.PI)/lados);
		int radio=10;
		
		for(int i=0;i<lados;i++)
			flecha.addPoint((int)(centro.x+(radio*Math.sin(i*alfa))),(int)(centro.y+(radio*Math.cos(i*alfa))));
		
		return flecha;
	}
	private Polygon RellenarFlechaDerecha(Point centro) {
		Polygon flecha= new Polygon();
		int lados=3;
		double alfa= ((2*Math.PI)/lados);
		int radio=10;
		
		for(int i=0;i<lados;i++)
			flecha.addPoint((int)(centro.x+(radio*Math.cos(i*alfa))),(int)(centro.y+(radio*Math.sin(i*alfa))));
		
		return flecha;
	}
	private Polygon RellenarFlechaIzquierda(Point centro) {
		Polygon flecha= new Polygon();
		int lados=3;
		double alfa= ((2*Math.PI)/lados);
		int radio=10;
		
		for(int i=0;i<lados;i++)
			flecha.addPoint((int)(centro.x-(radio*Math.cos((i*alfa)))),(int)(centro.y-(radio*Math.sin(i*alfa))));
		
		return flecha;
	}
	
}
